package com.gitee.swsk33.gateway.filter;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * 自定义的一个全局过滤器
 */
@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {

	/**
	 * 全局过滤器逻辑
	 *
	 * @param exchange 请求上下文，用于获取请求对象和响应对象
	 * @param chain    用于把请求委托给下一个过滤器
	 * @return 返回表示当前过滤器业务结束
	 */
	@Override
	public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
		// 先获取请求对象
		ServerHttpRequest request = exchange.getRequest();
		// 获取请求头中的authorization参数
		String auth = request.getHeaders().getFirst("authorization");
		// 校验
		if (auth.equals("admin")) {
			// 放行到下一个过滤器
			// 固定写法
			return chain.filter(exchange);
		}
		// 否则设定响应状态码为403
		exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
		// 设定响应为结束状态，也是固定写法
		return exchange.getResponse().setComplete();
	}

	/**
	 * 该方法用于返回该过滤器顺序，值越小越前
	 *
	 * @return -1表示位于最前
	 */
	@Override
	public int getOrder() {
		return -1;
	}

}